home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 21 / Cream of the Crop 21 (Terry Blount) (October 1996).iso / os2 / freetype.zip / ttdebug.pas < prev    next >
Pascal/Delphi Source File  |  1996-08-17  |  15KB  |  647 lines

  1. unit TTDEBUG;
  2.  
  3. interface
  4.  
  5. uses TTTypes, TTIns;
  6.  
  7. type
  8.  
  9.   ByteHexStr  = string[2];    (* hex representation of a byte  *)
  10.   ShortHexStr = string[4];    (*  "         "         "  short *)
  11.   LongHexStr  = string[8];    (*  "         "         "  long  *)
  12.   DebugStr    = string[128];  (* disassembled line output      *)
  13.  
  14.   { TBreakPoint }
  15.  
  16.   { A simple record to hold breakpoint information   }
  17.   { it may be completed later with pass count, etc.. }
  18.   { They must be in a sorted linked list             }
  19.  
  20.   PBreakPoint = ^TBreakPoint;
  21.   TBreakPoint = record
  22.                   Next      : PBreakPoint;
  23.                   Adresse   : Int;
  24.                 end;
  25.  
  26.   { TRangeRec }
  27.  
  28.   { a record to store line number information and breakpoints list }
  29.  
  30.   PRangeRec = ^TRangeRec;
  31.   TRangeRec = record
  32.                 Code         : PByteArray;
  33.                 Size         : Int;
  34.                 NLines       : Int;
  35.                 Disassembled : PShortArray;
  36.                 Breaks       : PBreakPoint;
  37.               end;
  38.  
  39.  
  40. { Generate_Range : Generate Line Number information specific to }
  41. {                  a given range                                }
  42.  
  43. procedure Generate_Range( CR     : PCodeRange;
  44.                           var RR : TRangeRec );
  45.  
  46. { Throw_Range : Discard Line Number Information }
  47.  
  48. procedure Throw_Range( var RR : TRangeRec );
  49.  
  50. { Toggle_Break : Toggle a breakpoint }
  51.  
  52. procedure Toggle_Break( var RR : TRangeRec; Adr : Int );
  53.  
  54. { Set_Break : Set a breakpoint on a given address }
  55.  
  56. procedure Set_Break  ( var RR : TRangeRec; Adr : Int );
  57.  
  58. { Clear_Break : Clear one specific breakpoint }
  59.  
  60. procedure Clear_Break( var RR : TRangeRec; Adr : Int );
  61.  
  62. { Clear_All_Breaks : Clear breakpoint list }
  63.  
  64. procedure Clear_All_Breaks( var BP : PBreakPoint );
  65.  
  66. { Cur_U_Line : returns the current disassembled line at Code(IP) }
  67.  
  68. function Cur_U_Line( Code : PByteArray; IP : Int ) : DebugStr;
  69.  
  70. { Get_Length : returns the length of the current opcode at Code(IP) }
  71.  
  72. function Get_Length( Code : PByteArray; IP : Int ) : Int;
  73.  
  74. { Hex_N : returns an hexadecimal string }
  75.  
  76. function Hex8 ( B : Byte ) : ByteHexStr;
  77. function Hex16( W : word ) : ShortHexStr;
  78. function Hex32( L : Long ) : LongHexStr;
  79.  
  80.  
  81. implementation
  82.  
  83. type
  84.   PShort = ^Int16;
  85.   PLong  = ^Long;
  86.  
  87.   PStorageLong = ^TStorageLong;
  88.   TStorageLong = record           (* do-it-all union record type *)
  89.                    case Byte of
  90.                     0 : ( L      : LongInt );
  91.                     1 : ( S1, S2 : Integer );
  92.                     2 : ( W1, W2 : Word );
  93.                     3 : ( B1, B2,
  94.                           B3, B4 : Byte );
  95.                     4 : ( P      : Pointer );
  96.                   end;
  97.  
  98. var
  99.   OpSize : int;
  100.  
  101. const
  102.   OpStr : array[ 0..255 ] of String[10]
  103.         = (
  104.             'SVTCA y',       (* Set vectors to coordinate axis y    *)
  105.             'SVTCA x',       (* Set vectors to coordinate axis x    *)
  106.             'SPvTCA y',      (* Set Proj. vec. to coord. axis y     *)
  107.             'SPvTCA x',      (* Set Proj. vec. to coord. axis x     *)
  108.             'SFvTCA y',      (* Set Free. vec. to coord. axis y     *)
  109.             'SFvTCA x',      (* Set Free. vec. to coord. axis x     *)
  110.             'SPvTL //',      (* Set Proj. vec. parallel to segment  *)
  111.             'SPvTL +',       (* Set Proj. vec. normal to segment    *)
  112.             'SFvTL //',      (* Set Free. vec. parallel to segment  *)
  113.             'SFvTL +',       (* Set Free. vec. normal to segment    *)
  114.             'SPvFS',         (* Set Proj. vec. from stack           *)
  115.             'SFvFS',         (* Set Free. vec. from stack           *)
  116.             'GPV',           (* Get projection vector               *)
  117.             'GFV',           (* Get freedom vector                  *)
  118.             'SFvTPv',        (* Set free. vec. to proj. vec.        *)
  119.             'ISECT',         (* compute intersection                *)
  120.  
  121.             'SRP0',          (* Set reference point 0               *)
  122.             'SRP1',          (* Set reference point 1               *)
  123.             'SRP2',          (* Set reference point 2               *)
  124.             'SZP0',          (* Set Zone Pointer 0                  *)
  125.             'SZP1',          (* Set Zone Pointer 1                  *)
  126.             'SZP2',          (* Set Zone Pointer 2                  *)
  127.             'SZPS',          (* Set all zone pointers               *)
  128.             'SLOOP',         (* Set loop counter                    *)
  129.             'RTG',           (* Round to grid                       *)
  130.             'RTHG',          (* Round to half grid                  *)
  131.             'SMD',           (* Set Minimum Distance                *)
  132.             'ELSE',          (* Else                                *)
  133.             'JMPR',          (* Jump Relative                       *)
  134.             'SCvTCi',        (* Set CVT                             *)
  135.             'SSwCi',         (*                                     *)
  136.             'SSW',           (*                                     *)
  137.  
  138.             'DUP',
  139.             'POP',
  140.             'CLEAR',
  141.             'SWAP',
  142.             'DEPTH',
  143.             'CINDEX',
  144.             'MINDEX',
  145.             'AlignPTS',
  146.             'INS_$28',
  147.             'UTP',
  148.             'LOOPCALL',
  149.             'CALL',
  150.             'FDEF',
  151.             'ENDF',
  152.             'MDAP[0]',
  153.             'MDAP[1]',
  154.  
  155.             'IUP[0]',
  156.             'IUP[1]',
  157.             'SHP[0]',
  158.             'SHP[1]',
  159.             'SHC[0]',
  160.             'SHC[1]',
  161.             'SHZ[0]',
  162.             'SHZ[1]',
  163.             'SHPIX',
  164.             'IP',
  165.             'MSIRP[0]',
  166.             'MSIRP[1]',
  167.             'AlignRP',
  168.             'RTDG',
  169.             'MIAP[0]',
  170.             'MIAP[1]',
  171.  
  172.             'NPushB',
  173.             'NPushW',
  174.             'WS',
  175.             'RS',
  176.             'WCvtP',
  177.             'RCvt',
  178.             'GC[0]',
  179.             'GC[1]',
  180.             'SCFS',
  181.             'MD[0]',
  182.             'MD[1]',
  183.             'MPPEM',
  184.             'MPS',
  185.             'FlipON',
  186.             'FlipOFF',
  187.             'DEBUG',
  188.  
  189.             'LT',
  190.             'LTEQ',
  191.             'GT',
  192.             'GTEQ',
  193.             'EQ',
  194.             'NEQ',
  195.             'ODD',
  196.             'EVEN',
  197.             'IF',
  198.             'EIF',
  199.             'AND',
  200.             'OR',
  201.             'NOT',
  202.             'DeltaP1',
  203.             'SDB',
  204.             'SDS',
  205.  
  206.             'ADD',
  207.             'SUB',
  208.             'DIV',
  209.             'MUL',
  210.             'ABS',
  211.             'NEG',
  212.             'FLOOR',
  213.             'CEILING',
  214.             'ROUND[0]',
  215.             'ROUND[1]',
  216.             'ROUND[2]',
  217.             'ROUND[3]',
  218.             'NROUND[0]',
  219.             'NROUND[1]',
  220.             'NROUND[2]',
  221.             'NROUND[3]',
  222.  
  223.             'WCvtF',
  224.             'DeltaP2',
  225.             'DeltaP3',
  226.             'DeltaCn[0]',
  227.             'DeltaCn[1]',
  228.             'DeltaCn[2]',
  229.             'SROUND',
  230.             'S45Round',
  231.             'JROT',
  232.             'JROF',
  233.             'ROFF',
  234.             'INS_$7B',
  235.             'RUTG',
  236.             'RDTG',
  237.             'SANGW',
  238.             'AA',
  239.  
  240.             'FlipPT',
  241.             'FlipRgON',
  242.             'FlipRgOFF',
  243.             'INS_$83',
  244.             'INS_$84',
  245.             'ScanCTRL',
  246.             'SDVPTL[0]',
  247.             'SDVPTL[1]',
  248.             'GetINFO',
  249.             'IDEF',
  250.             'ROLL',
  251.             'MAX',
  252.             'MIN',
  253.             'ScanTYPE',
  254.             'IntCTRL',
  255.             'INS_$8F',
  256.  
  257.             'INS_$90',
  258.             'INS_$91',
  259.             'INS_$92',
  260.             'INS_$93',
  261.             'INS_$94',
  262.             'INS_$95',
  263.             'INS_$96',
  264.             'INS_$97',
  265.             'INS_$98',
  266.             'INS_$99',
  267.             'INS_$9A',
  268.             'INS_$9B',
  269.             'INS_$9C',
  270.             'INS_$9D',
  271.             'INS_$9E',
  272.             'INS_$9F',
  273.  
  274.             'INS_$A0',
  275.             'INS_$A1',
  276.             'INS_$A2',
  277.             'INS_$A3',
  278.             'INS_$A4',
  279.             'I